;********************************************************
;*							*
;*	CP/M-86 ARCHIVE.A86 File Backup Utility		*
;*							*
;*	See the August 1982 issue of LifeLines		*
;*	for full documentation on this program.		*
;*							*
;********************************************************
;
;	Originally written by Kelly Smith, June 6, 1982
;
;	Published in Liflines/The Software Magazine
;	August 1982
;
;VERSION LIST, most recent version first
;
;24/Dec/82 Changed msgout routine to strip MSB of characters to
;	   to be displayed, as some 8086 machines accept MSB of
;	   char to display special or graphics characters (i.e.
;	   NEC APC. Further changes to messages.
;	   Version 1.1 Bill Bolton
;
;13/Aug/82 Numerous keying errors corrected, VERS and REV equates
;	   added, header reformatted, some messages reformatted
;	   and reworded. XLT86ed from CP/M-80 version. Bill Bolton
;
;09/Aug/82 Keyed in from Lifelines. MSGOUT subroutine added.
;	   Steve Engel
; 
;06/Jun/82 Orginal version. Kelly Smith
;
	TITLE	'ARCHIVE Version 1.0'
;
M	EQU	Byte Ptr 0[BX]		;Xlt86's derived 'M'
;
vers	EQU	11			;Version number
rev	EQU	'A'			;Revision number
;
true	EQU	-1
false	EQU	not true
mpm	EQU	false			;conditional for mpm
;
bdos	EQU	5			;cpm entry point
exit	EQU	0			;cpm exit point
dfcb	EQU	05ch			;cpm default fcb
fcbext	EQU	dfcb+12			;fcb extent byte
fcbrno	EQU	dfcb+32			;fcb record number byte
dbuff	EQU	80h			;default buffer
;
coninp	EQU	1			;console input buffer
pchar	EQU	2			;print character
dircon	EQU	6			;direct console i/o
pmessg	EQU	9			;print message
constat	EQU	11			;console status
version	EQU	12			;return cp/m version number
rsetdsk	EQU	13			;reset disk system
seldsk	EQU	14			;select disk
open	EQU	15			;open file
close	EQU	16			;close file
srchfst	EQU	17			;search first
srchnxt	EQU	18			;search next
delete	EQU	19			;delete file
read	EQU	20			;read record
write	EQU	21			;write record
make	EQU	22			;make file
currdsk	EQU	25			;return current disk
stdma	EQU	26			;set dma address
attrib	EQU	30			;set file attribute
;
tab	EQU	9
lf	EQU	0ah
cr	EQU	0dh
;
	ORG	0100h
;
	JMPS	over
;
	DB	cr,lf,'Archive Version '
	DB	vers/10 +'0','.',vers mod 10 +'0'
	DB	rev
	DB	', Kelly Smith'
	DB	cr,lf,'Z'-40h
;
;get current disk and save it
;
over:
	MOV	CL,currdsk		;get function
	INT	224
	MOV	Byte Ptr logdsk,AL	;save as logged disk
;
;reset disk system is case someone swapped a disk
;
	MOV	CL,rsetdsk		;get the function
	INT	224
;
;now return to original logged disk
;
	MOV	AL,Byte Ptr logdsk	;get logged disk
	MOV	DL,AL
	MOV	CL,seldsk
	INT	224
;
;announcing, the new improved ARCHIVE.
;
	MOV	DX,(Offset signon)
	CALL	msgout
;
;check for proper environment, we only live for CP/M-86 1.0 or later
;
	MOV	CL,version
	INT	224
	CMP	AL,22h			;correct version?
	MOV	DX,(Offset bad@ver@num)
	JZ	L_3			;yes
	JMP	arcexit			;no, display error message
L_3:
;
;
;check if filename specified, abort if not
;
	MOV	AL,Byte Ptr .dfcb+1
	CMP	AL,' '
	JNZ	gotname			;got a name ?
	MOV	DX,(Offset no@file@nam)	;inform user no filename
	CALL	msgout
	MOV	DX,(Offset opts)	;tell 'em wot to do
	JMPS	arcexit			;bail out now-no name
;
;got a name,now check to see which (if any) disk specified
;
gotname:
	MOV	AL,Byte Ptr .dfcb	;check for specific drive
	DEC	AL
	MOV	DL,AL			;set up for select disk call
	MOV	CL,seldsk
	INC	AL			;if no drive spec, skip call
	MOV	Byte Ptr src@dsk@num,AL	;save drive specifier for later
	JZ	L_4	
	INT	224
L_4:
	XOR	AL,AL			;now zap out drive specifier
	MOV	Byte Ptr .dfcb,AL
	MOV	AL,'?'			;force extent number wild
	MOV	Byte Ptr .dfcb+12,AL
	MOV	AL,Byte Ptr .dfcb+17	;get option
	MOV	Byte Ptr option,AL	;and save for later
	CMP	AL,'B'			;backup ?
	JZ	okopt
	CMP	AL,'S'			;set archive
	JZ	okopt
	CMP	AL,'R'			;reset archive
	JZ	okopt
	CMP	AL,'D'			;display archive
	JZ	okopt
;
badot:
	MOV	DX,(Offset ilgopt)	;point to bad option
arcexit:
	CALL	msgout
	MOV	CL,0
	MOV	DL,0
	INT	224
;
;findout now, if operator is for backup or general lobotomy
;
okopt:
	MOV	AL,Byte Ptr option	;get option back
	CMP	AL,'B'
	JNZ	arc@s@r			;not backup, something else
dest:
	MOV	DX,(Offset req@dest)	;ask for destination
	CALL	msgout
	MOV	CL,coninp		;get console input
	INT	224
	AND	AL,05fh			;force upper case
	SBB	AL,'A'			;force binary digit
	CMP	AL,16			;disk > 16
	JNB	dest			;must satisfy ourselves
	MOV	BX,(Offset logdsk)	;is this jerk backing up to
					;same disk ?
	AND	AL,0fh			;strip high nibble
	CMP	AL,M
	LAHF				;save flags
	XCHG	AL,AH
	PUSH	AX
	XCHG	AL,AH
	INC	AL			;readjust disk number
	MOV	Byte Ptr dest@dsk@num,AL
	POP	AX
	XCHG	AL,AH
	SAHF
	JZ	dsksame			;if same, tell em' so now
	INC	BX			;bump pointer to dest disk
	MOV	AL,M			;get disk number
	INC	BX			;bump pointer to source disk
	CMP	AL,M
	JZ	L_5	
	JMP	backup
L_5:
dsksame:
	MOV	DX,(Offset same@dsk)	;point to same disk messg
	CALL	msgout
	JMPS	dest
;
;ready for directory write operations now..do archive set/reset
;
arc@s@r:
	CALL	crlf
	XOR	AL,AL			;zero file count
	MOV	Byte Ptr filcnt,AL
	MOV	DX,dfcb
	MOV	CL,srchfst
	INT	224
	INC	AL			;search successfull ?
	JNZ	gotfile			;yes, proceed
	MOV	DX,(Offset no@file@fnd)	;point to error message
	JMP	arcexit			;print error and exit
;
gotfile:
	DEC	AL			;for 'inr' above
	ROR	AL,1
	ROR	AL,1
	ROR	AL,1
	AND	AL,60h
	MOV	BX,dbuff		;point to base of buffer
	MOV	CL,AL
	MOV	CH,0
	LAHF				;index file by offset
	ADD	BX,CX
	RCR	SI,1
	SAHF
	RCL	SI,1
	PUSH	BX			;save dir entry
	MOV	CX,(Offset filetable)	;point to base of file table
	CALL	filepoint		;get table pointer into HL
	XCHG	BX,DX			;put it in DE instead
	MOV	AL,Byte Ptr filcnt	;keep track of number of files
	INC	AL
	MOV	Byte Ptr filcnt,AL
	POP	BX			;HL points to dir entry
	MOV	CH,32
	CALL	blkmov
getnext:
	MOV	CL,srchnxt		;search for next
	MOV	DX,dfcb
	INT	224
	INC	AL			;returns 0ffh if at end of
					;search
	JNZ	gotfile			;got another-go save it
;
;end of directory encountered - process now
;
tagfile:
	CALL	abort			;check for user abort
	MOV	CX,(Offset filetable)-32 ;allow for file count +1
	CALL	filepoint
	PUSH	BX
	MOV	DX,dfcb			;copy name to dfcb
	MOV	CH,32
	CALL	blkmov			;move it
	XOR	AL,AL
	MOV	Byte Ptr .dfcb,AL	;clear drive number
	MOV	DX,-20			;point back to extent field
	LAHF
	ADD	BX,DX
	RCR	SI,1
	SAHF
	RCL	SI,1
	MOV	M,'$'			;tag end of print here
	POP	DX			;get back pointer to start
	LAHF				;bump forward to name
	INC	DX
	SAHF
	CALL	msgout
	MOV	DL,' '			;space between name and ext
	MOV	CL,pchar
	INT	224
	MOV	AL,Byte Ptr .dfcb+12	;get extent number
	LAHF				;save it
	XCHG	AL,AH
	PUSH	AX
	XCHG	AL,AH
	ADD	AL,'0'			;make ASCII
	MOV	DL,AL
	MOV	CL,pchar
	POP	AX
	INT	224
	MOV	AL,Byte Ptr option	;get otion back
	CMP	AL,'D'			;display only ?
	JZ	nextfile
	ROR	AL,1			;bit 7=0 for B,R,D and 1 for S
	AND	AL,80h
	MOV	CH,AL			;save mask
	MOV	DX,dfcb+11		;point to t3
	MOV	SI,DX			;get it
	MOV	AL,[SI]
	AND	AL,07fh			;and strip it
	OR	AL,CH			;set if set option
	MOV	SI,DX			;and put it back
	MOV	[SI],AL
	MOV	DX,dfcb			;point to start of fcb
	XOR	AL,AL			;zap out drive field
	MOV	SI,DX
	MOV	[SI],AL
	MOV	CL,attrib		;do set file attribute
	INT	224
;
nextfile:
	MOV	AL,Byte Ptr .dfcb+11	;get t3
	ROL	AL,1			;isolate t3
	AND	AL,1
	ADD	AL,'R'			;make 'R' or 'S'
	MOV	Byte Ptr donmsg+1,AL
	MOV	DX,(Offset donmsg)
	CALL	msgout			;print completion message
;	call	crlf
	MOV	BX,(Offset filcnt)	;point to file counter
	DEC	M			;count it down
	JNZ	L_6	
	MOV	CL,0			;exit if done
	MOV	DL,0
	INT	224
L_6:
	JMP	tagfile			;tag next file
;
;backup routine - does mutiple file search and copy
;
backup:
	CALL	crlf
noback:
	CALL	abort			;check for abort
	CALL	mfname			;set up multi-file search
	JNB	movname			;file found if no carry
	MOV	AL,Byte Ptr mfflg1	;check if anything ever found..
	OR	AL,AL
	MOV	DX,(Offset bakup@done)	;set-up backup done message
	JNZ	nofile			;if not-indicate
	MOV	AL,Byte Ptr got@arc	;check archive found flag
	OR	AL,AL
	JZ	L_7	
	JMP	arcexit			;if not zero, must have found 1
L_7:
	MOV	DX,(Offset narcs)	;indicate no arcive files found
	JMP	arcexit			;print message and exit
;
nofile:
	MOV	DX,(Offset no@file@fnd)	;oops, file not found
	JMP	arcexit
;
movname:
	MOV	BX,dfcb+11		;point to t3 in fcb
	MOV	AL,M			;get it
	ROL	AL,1			;archive bit set
	JB	noback			;if so, no backup required
	ROR	AL,1			;adjust back to normal
	MOV	Byte Ptr got@arc,AL	;set archive file found flag
	OR	AL,080h			;set archived flag
	MOV	M,AL			;put it back
	PUSH	BX			;save pointer
	MOV	DX,dfcb			;point fcb
	MOV	CL,attrib		;make a set attributes
	INT	224
	POP	BX			;restore pointer
	DEC	BX			;point to t2 in fcb
	MOV	AL,M			;get it
	AND	AL,07fh			;strip off t2
	MOV	M,AL			;put it back
	DEC	BX			;point to t1 in filename
	MOV	AL,M			;get t1 byte
	AND	AL,07fh			;strip it
	MOV	M,AL			;save it
	MOV	BX,dfcb+1		;point to filename for move
	MOV	DX,(Offset fname)	;display dest for filename
	MOV	CH,8			;setup 8 for mve
	CALL	blkmov			;and move it
	MOV	DX,(Offset fname)+9	;point to ext
	MOV	CH,3
	CALL	blkmov
dspname:
	MOV	DX,(Offset fname)	;display name and filetype
	CALL	msgout
;
;save first fcb for user later as destination filename
;
	MOV	CH,11			;number of chars to move
	MOV	BX,dfcb+1		;from here
	MOV	DX,(Offset destfcb)+1	;to here
	CALL	blkmov			;move em'
;
;open the source file
;
	MOV	AL,Byte Ptr logdsk	;select the disk
	MOV	DL,AL
	MOV	CL,seldsk
	INT	224
	MOV	DX,dfcb
	MOV	CL,open			;make an open call
	INT	224
	CMP	AL,0ffh			;file not found ?
	JNZ	openok
	MOV	DX,(Offset src@open@err)	;oops, source file open error
	JMP	arcexit
;
;open the destination file
;
openok:
	MOV	DX,(Offset destfcb)	;point to destination fcb
	MOV	AL,Byte Ptr dest@dsk@num	;get dest disk #
	MOV	SI,DX			;put it in the fcb
	MOV	[SI],AL
	MOV	CL,delete		;erase any old file
	INT	224
	MOV	DX,(Offset destfcb)
	MOV	CL,make
	INT	224			;make the new one
	CMP	AL,0ffh			;all ok ?
	JNZ	L_8	
	JMP	full
L_8:
;
;read source file to buffer, write to destination file
;
copy:
	MOV	BX,((Offset table@end)-(Offset filetable))/128	;save buffer size
	MOV	Word Ptr bufmax,BX
	XOR	AL,AL			;clear eof flag
	MOV	Byte Ptr eof@flg,AL
copy1:
	CALL	abort			;check for user abort
	MOV	BX,0			;set current counter to 0
	MOV	Word Ptr bufcnt,BX
	MOV	BX,(Offset filetable)	;set buffer start pointer
	MOV	Word Ptr bufpnt,BX
;
;file source reading loop to read all of buffer full or stop on
;eof
;
copy2:
	MOV	BX,Word Ptr bufpnt	;set dma address to buffer pntr
	XCHG	BX,DX
	MOV	CL,stdma
	INT	224
	MOV	DX,dfcb			;point at default fcb for reading
	MOV	CL,read			;make a read
	INT	224
	OR	AL,AL			;check if read was ok or eof
	JNZ	copy3			;end of file
	MOV	BX,Word Ptr bufpnt	;set buffer pntr up 1 sector
	MOV	DX,128
	LAHF
	ADD	BX,DX
	RCR	SI,1
	SAHF
	RCL	SI,1
	MOV	Word Ptr bufpnt,BX
	MOV	BX,Word Ptr bufcnt	;increase buffer sector count
	LAHF
	INC	BX
	SAHF
	MOV	Word Ptr bufcnt,BX
	XCHG	BX,DX
	MOV	BX,Word Ptr bufmax	;maximum sector count
	CALL	cdehl			;compare
	JNZ	copy2
	JMPS	copy4
;
;here if read operation indicates file is at end on read
;
copy3:
	MOV	AL,0ffh			;set eof flag
	MOV	Byte Ptr eof@flg,AL
;
;write operation pro cessing loop to send mem to disk file
;
copy4:
	MOV	BX,(Offset filetable)	;point to byffer
	MOV	Word Ptr bufpnt,BX
copy5:
	CALL	abort			;check for abort
	MOV	BX,Word Ptr bufcnt	;see if buffer is empty
	MOV	AL,BH
	OR	AL,BL
	JZ	copy6			;buffer empty so check eof flag
	DEC	BX			;dec buffer sector count
	MOV	Word Ptr bufcnt,BX
	MOV	BX,Word Ptr bufpnt	;set up buffer pointer
	PUSH	BX			;save for size bump
	XCHG	BX,DX
	MOV	CL,stdma
	INT	224
	POP	BX
	MOV	DX,128			;increase by 1 sector size
	ADD	BX,DX
	MOV	Word Ptr bufpnt,BX
	MOV	DX,(Offset destfcb)	;point to dstination fcb
	MOV	CL,write		;make a write record
	INT	224
	OR	AL,AL			;any errors ?
	JZ	copy5			;no-continue
	JMPS	full			;yes-disk maybe full
;
copy6:
	MOV	AL,Byte Ptr eof@flg	;buffer all written, go and
					;check eof
	OR	AL,AL
	JNZ	L_9
	JMP	copy1
L_9:
	MOV	DX,(Offset destfcb)	;point to destination fcb
	MOV	CL,close		;close file
	INT	224
	CMP	AL,0ffh			;all Ok
	JZ	L_10
	JMP	backup			;yes-continue
L_10:
	MOV	DX,(Offset src@close@err)	;no-close error
	JMP	arcexit
;
; subroutine to compare [DE] to [HL],  [Z] set if equal

cdehl:
	MOV	AL,DH			;high byte equal ?
	CMP	AL,BH
	JZ	L_11
	RET
L_11:
	MOV	AL,DL			;yes-how about low byte
	CMP	AL,BL
	RET				;set zero if equal
;
;subroutine to allow disk change, to continue backup proceedure
;
full:
	MOV	DX,(Offset destfcb)	;delete partial file
	MOV	CL,delete
	INT	224
	MOV	DX,(Offset dsk@full)	;indicate disk is full
	CALL	msgout
	MOV	AL,Byte Ptr dest@dsk@num	;get dest disk number
	ADD	AL,040h			;make it ASCII
	MOV	DL,AL
	MOV	CL,pchar
	INT	224
	MOV	DX,(Offset now@full)	;display remainder of message
	CALL	msgout
req@cnt:
	MOV	DX,(Offset enter@ret)	;tell em' to remove disk and
					;hit return
	CALL	msgout
	MOV	CL,coninp
	INT	224
	CMP	AL,cr			;cr ?
	JNZ	req@cnt			;if not ask again
	CALL	crlf
	MOV	CL,rsetdsk		;make a reset disk system
	INT	224
	CALL	reset@fcb		;also reset the fcb
	JMP	dspname			;continue on new disk, with
					;last file
;
;Multi-file access subroutine. Allows processing of multiple
;files (i.e. *.*) from disk. This routine builds the proper
;name in the fcb each time it is called. Carry is set if no
;more names can be found.
;
mfname:
	MOV	CL,stdma		;set dma address
	MOV	DX,dbuff
	INT	224
	XOR	AL,AL			;clear fcb extention and rec #
	MOV	Byte Ptr .fcbext,AL
	MOV	Byte Ptr .fcbrno,AL
	MOV	AL,Byte Ptr mfflg1	;get multi-file flag
	OR	AL,AL
	JZ	mfile1			;if zero, not first time flag
	MOV	BX,dfcb			;save filename as requestd name
	MOV	DX,(Offset mfreq)
	MOV	CH,12
	CALL	blkmov
	MOV	AL,Byte Ptr .dfcb
	MOV	Byte Ptr mfcur,AL	;save disk in current fcb
	MOV	BX,(Offset mfreq)	;set-up for filename search
	MOV	DX,dfcb
	MOV	CH,12
	CALL	blkmov
	MOV	CL,srchfst		;search for 1st match
	MOV	DX,dfcb
	INT	224
	JMPS	mfile2			;check if file found
;
mfile1:
	MOV	BX,(Offset mfcur)	;search first on current name
	MOV	DX,dfcb
	MOV	CH,12
	CALL	blkmov
	MOV	CL,srchfst
	MOV	DX,dfcb
	INT	224
	MOV	BX,(Offset mfreq)	;do search on filename
	MOV	DX,dfcb
	MOV	CH,12
	CALL	blkmov
	MOV	CL,srchnxt		;make a search next
	MOV	DX,dfcb
	INT	224
mfile2:
	INC	AL			;return carry set if file not
	STC				;found
	JNZ	L_12
	RET
L_12:
;
;move name found to current filename
;
	DEC	AL			;adjust location found
	AND	AL,3
	ADD	AL,AL
	ADD	AL,AL
	ADD	AL,AL
	ADD	AL,AL
	ADD	AL,AL
	ADD	AL,81h
	MOV	BL,AL			;make filename pointer
	MOV	BH,0
	PUSH	BX			;save pointer
	MOV	DX,(Offset mfcur)+1
	MOV	CH,11
	CALL	blkmov			;move name to current filename
;
;move filename found to fcb
;
	POP	BX			;restore filename pointer
	MOV	DX,dfcb+1
	MOV	CH,11
	CALL	blkmov
;
;setup fcb for subsequent file write operation
;
reset@fcb:
	MOV	DX,dfcb			;point to source fcb
	MOV	AL,Byte Ptr src@dsk@num	;force disk #, in case not
	MOV	SI,DX			;logged disk
	MOV	[SI],AL
	XOR	AL,AL			;clean up for new file backup
	MOV	Byte Ptr .fcbext,AL
	MOV	Byte Ptr .fcbrno,AL
	MOV	Byte Ptr destfcb,AL
	MOV	Byte Ptr destfcb+12,AL
	MOV	Byte Ptr destfcb+32,AL
	MOV	Byte Ptr mfflg1,AL	;turn off 1st time flag
	RET
;
;subroutine to perform a block move (aahh for a Z-80)
;
blkmov:
	MOV	AL,M			;copy byte from [HL] to [DE]
	MOV	SI,DX
	MOV	[SI],AL
	LAHF
	INC	BX
	SAHF
	LAHF
	INC	DX
	SAHF
	DEC	CH
	JNZ	blkmov			;continue for B bytes
	RET
;
;subroutine to index [BC] by file counter
;
filepoint:
	MOV	BX,Word Ptr filcnt	;get file counter
	MOV	BH,0			;force high order to 0
	SHL	BX,1			;multiply by 32
	SHL	BX,1
	SHL	BX,1
	SHL	BX,1
	SHL	BX,1
	LAHF				;use as index to file table
	ADD	BX,CX
	RCR	SI,1
	SAHF
	RCL	SI,1
	RET
;
;subroutine to check for user abort (control C)
;
abort:
	PUSH	BX			;save all regs
	PUSH	DX
	PUSH	CX
	LAHF
	XCHG	AL,AH
	PUSH	AX
	XCHG	AL,AH
	MOV	CL,dircon		;make a direct console I/O
	MOV	DL,0ffh			;input only
	INT	224
	OR	AL,AL			;set flags
	JZ	abortx			;return if zero result
	CMP	AL,'C'-040h		;control-c ?
	JNZ	abortx			;no-return
	MOV	DX,(Offset abort@process)	;point to proper message
	CALL	msgout
	MOV	CL,0
	MOV	DL,0
	INT	224
;
abortx:
	POP	AX
	XCHG	AL,AH
	SAHF
	POP	CX
	POP	DX
	POP	BX
	RET
;
;subroutine to print a crlf
;
crlf:
	MOV	DX,(Offset crlf@msg)
;
;subroutine to print out a message pointed to by DX
;
msgout:
	PUSH	DX			;might need pointer again
	MOV	SI,DX
mloop:
	MOV	AL,[SI]			;get char from string
	AND	AL,07fh			;strip off high bit
	CMP	AL,'$'			;string terminator?
	JZ	mdone			;Yes, exit
	MOV	DL,AL
	MOV	CL,pchar		;No, display it
	INT	224
	INC	SI			;point to next char in string
	JMP	mloop
;
mdone:
	POP	DX
	RET
;
;
signon		DB	cr,lf,'Archive Version '
		DB	vers/10 + '0','.',vers mod 10 + '0'
		DB	rev
		DB	cr,lf
		DB	'CP/M-86 File BACK UP utility.'
		DB	cr,lf,cr,lf,'$'
;
ilgopt		DB	'Invalid or Unspecified option - must be'
		DB	' specified as:',cr,lf,cr,lf
opts		DB	tab,'B - Backup file(s) with Archive flag set or,'
		DB	cr,lf
		DB	tab,'S - Set Archive flag on file(s) or,'
		DB	cr,lf
		DB	tab,'R - Reset Archive flag on file(s) or,'
		DB	cr,lf
		DB	tab,'D - Display state of Archive flag on file(s)'
		DB	cr,lf,'$'
;
no@file@fnd	DB	cr,lf,'File not found, aborting$'
;
donmsg		DB	' $'
;
crlf@msg	DB	cr,lf,'$'
;
bad@ver@num	DB	'Sorry, you MUST have CP/M-86 Version 1.0 or later to use ARCHIVE.$'
;
req@dest	DB	'Destination disk for files to be BACKED UP (A to P)? $'
;
same@dsk	DB	cr,lf,'You can''t BACK UP files to the Source disk!'
		DB	cr,lf,'$'
;
abort@process	DB	cr,lf,'User abort of BACK UP process$'
;
narcs		DB	cr,lf,'No files with Archive flag set were found to BACK UP$'
;
no@file@nam	DB	'No filename or Option specified - '
		DB	'ARCHIVE must be invoked as:'
		DB	cr,lf,cr,lf
		DB	tab,'ARCHIVE FN.FT OPTION <CR>'
		DB	cr,lf,cr,lf
		DB	'Where:',tab,'FN.FT is the filename'
		DB	' and filetype'
		DB	cr,lf,cr,lf
		DB	'And:',tab,'OPTION is specified as:'
		DB	cr,lf,cr,lf,'$'
;
src@open@err	DB	cr,lf,'Oops, Can''t open file on'
		DB	' Source disk$'
;
dsk@full	DB	cr,lf,'Destination BACK UP disk $'
;
now@full	DB	': is now full - Remove and insert new Disk$'
;
enter@ret	DB	cr,lf,'Enter RETURN when ready to continue'
		DB	' BACK UP process: $'
;
src@read@err	DB	cr,lf,'CP/M-86 File Read ERROR on Source disk$'
;
src@close@err	DB	cr,lf,'CP/M-86 File Close ERROR on Destination disk$'
;
bakup@done:
	DB	cr,lf,'BACK UP Complete, Exiting to CP/M-86',cr,lf,'$'
;
fname	DB	'            $'		;for filename.typ
;
got@arc		DB	0		;archive file found flag
;
mfflg1		DB	1		;1st time flag for mf access
;
mfreq		RS	12		;mf requested filename
;
mfcur		RS	12		;mf current filename
;
arch@addr	RS	2		;archive patch address
;
logdsk		RS	1		;current logged disk
;
dest@dsk@num	RS	1		;dest disk number
;
src@dsk@num	RS	1		;source disk number
;
filcnt		RS	1		;count of files in filetable
;
option		RS	1		;option storage location
;
destfcb		RS	33		;destination fcb
;
bufmax		RS	2		;maximum buffer size
;
bufcnt		RS	2		;buffer sector count
;
bufpnt		RS	2		;buffer pointer
;
eof@flg		RS	1		;end-of-file flag
;
filetable EQU	(Offset $)		;file buffer space
		RS	4*4096		;buffer-up 16k
;
table@end	DB	0		;filetable end address
;
	END
